<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    //定义对象的属性
    // 1. 字面量创建  => 定义时赋值 可以取值 修改 可以循环遍历  可以删除
    // var obj = {
    //     name: "张三",
    //     age: 18,
    //     height: "180cm",
    //     weight: "80kg",
    // }


    // 2. 自定义对象的属性(构造函数Object的方法)
    // Object.defineProperty()  定义对象的属性(一次设置一个)
    // a. Object.defineProperty(target,key,desc)
    //    target  定义的对象
    //    key     键名(字符串)
    //    desc    键值描述(对象)
    //       value: "张三",     //属性的属性值
    //       writable: true,   //属性是否可以改写(默认true)
    //       enumerable: true,  //属性是否可以被枚举(遍历) (默认true)
    //       configurable: true // 属性是否可以被删除


    // b. Object.defineProperty(target,key,desc)  => 取值拦截 赋值拦截
    //    target  定义的对象
    //    key     键名(字符串)
    //    desc    键值描述(对象)
    //       enumerable: true,  //属性是否可以被枚举(遍历) (默认true)
    //       configurable: true // 属性是否可以被删除
    //       get: function () { }             取值拦截
    //       set: function () { }             赋值拦截


    // Object.defineProperties(target,options);  定义对象的属性(批量)
    //    target  定义的对象
    //    options 对象(key:desc) => 用于存放多个键名和键值描述的对象




    // 获取对象的属性描述
    // Object.getOwnPropertyDescriptor(target,key)  //对应键名获取属性描述
    // Object.getOwnPropertyDescriptors(target)     //获取对象的属性描述


    var obj = {}
    var _name = undefined;
    Object.defineProperties(obj, {
        name: {
            enumerable: true, //属性是否可以被枚举(遍历) (默认true)
            configurable: true, // 属性是否可以被删除
            get: function () { //obj.name取值时执行
                console.log("取值");
                return _name;
            },
            set: function (val) {//obj.name 赋值时执行 (val形参 => 用于接收赋值内容)
                console.log("赋值");
                _name = val;
            }
        },
        age: {
            value: 18,   //属性的属性值
            writable: true,
            enumerable: true,
            configurable: true
        },
        height: {
            value: "180cm",
            writable: true,
            enumerable: false,
            configurable: false
        },
        weight: {
            value: "80kg",   //属性的属性值
            writable: true,
            enumerable: false,
            configurable: false,
        }
    })

    // console.log(obj.name);
    // obj.name = "张三";
    // console.log(obj);

    // 获取
    var desc = Object.getOwnPropertyDescriptor(obj, "name");
    console.log(desc);
    var desc = Object.getOwnPropertyDescriptor(obj, "age");
    console.log(desc);

    var options = Object.getOwnPropertyDescriptors(obj);
    console.log(options);


    var str = new String("hello");
    var options = Object.getOwnPropertyDescriptors(str);
    console.log(options);







</script>

</html>